﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Persistencia;
using GestorDeFlotasModelo.Entities;
using Persistencia.Interfaces;
using System.Data.SqlClient;

namespace GestorDeFlotasModelo.Factorias
{
    public class FactoriaRendicion : Factoria, IIdentityFactory
    {
        private FactoriaRendicion(TransaccionBase tran)
            : base(tran)
        {
        }
       
        public override string NombreTabla
        {
            get { return " NUESTRA_RUBIA_ES_MEJOR.RendicionPorChofer "; }
        }

        protected override IPersistibleModelo NuevoPersistible(HashTableNCSensitive htsNc)
        {
            return new Rendicion();
        }

        protected override string Id(HashTableNCSensitive hts)
        {
            return hts["RendicionPorChofer_Id"].ToString();
        }

        protected override HashTableNCSensitive ParametrosClave()
        {
            HashTableNCSensitive parameters = new HashTableNCSensitive();
            parameters.Add("RendicionPorChofer_Id", null);
            return parameters;

        }

        protected override HashTableNCSensitive ParametrosNoClave()
        {
            HashTableNCSensitive parameters = new HashTableNCSensitive();
            parameters.Add("RendicionPorChofer_Chofer", null);
            parameters.Add("RendicionPorChofer_Turno", null);
            parameters.Add("RendicionPorChofer_Fecha", null);
            parameters.Add("RendicionPorChofer_Importe", null);
            return parameters;
        }

        protected override Predicate<IPersistibleModelo> FiltroXId(string id)
        {
            return delegate(IPersistibleModelo iPer)
            {
                return ((Rendicion)iPer).Id == long.Parse(id);
            };
        }

        public List<Rendicion> SelectParaRendicion(Int64 chofer, Int64 turno, DateTime fecha)
        {
            SqlCommand comm = new SqlCommand();
            comm.CommandText = "SELECT * FROM " + this.NombreTabla + " WHERE RendicionPorChofer_Chofer = @Chofer_id AND RendicionPorChofer_Turno = @Turno_id AND DATEADD(D, 0, DATEDIFF(D,0,RendicionPorChofer_Fecha)) = @Fecha";
            comm.Parameters.AddWithValue("@Chofer_id", chofer);
            comm.Parameters.AddWithValue("@Turno_id", turno);
            comm.Parameters.AddWithValue("@Fecha", fecha.Date);

            List<Rendicion> rendiciones = base.Select<Rendicion>(comm, delegate(IPersistibleModelo iPer)
            {
                return ((Rendicion)iPer).Chofer.Id == chofer
                  && ((Rendicion)iPer).Fecha.Date == fecha.Date
                  && ((Rendicion)iPer).Turno.Id == turno;
            });
            if (rendiciones.Count > 0)
                return rendiciones;
            else
                return new List<Rendicion>();
        }

        public Rendicion Nuevo(DateTime fecha, Chofer chofer, Turno turno, double importe)
        {
            Rendicion r = new Rendicion();
            r.Turno = turno;
            r.Importe = importe;
            r.Fecha = fecha;
            r.Chofer = chofer;

            base.Agregar(r);
            return r;
        }
    }
}
